Skip to content

NO-JIRA: All CVO manifests in payload should be included#1337

Open
hongkailiu wants to merge 3 commits intoopenshift:mainfrom
hongkailiu:annotation-checking
Open

NO-JIRA: All CVO manifests in payload should be included#1337
hongkailiu wants to merge 3 commits intoopenshift:mainfrom
hongkailiu:annotation-checking

Conversation

@hongkailiu
Copy link
Copy Markdown
Member

@hongkailiu hongkailiu commented Mar 5, 2026

Summary by CodeRabbit

  • Tests
    • Added a validation test that renders and parses Kubernetes manifests from the install and bootstrap directories, verifies each manifest includes at least one release annotation with the prefix include.release.openshift.io/, and fails listing any manifests missing the required annotation to ensure manifest compliance and release integrity.

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 5, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds a new test Test_cvoManifests in pkg/payload/render_test.go that renders manifests from ../../install and ../../bootstrap, parses them with github.com/openshift/library-go/pkg/manifest, and fails if any parsed manifest lacks an annotation with prefix include.release.openshift.io/, listing missing manifests.

Changes

Cohort / File(s) Summary
New/Updated Test
pkg/payload/render_test.go
Adds Test_cvoManifests(t *testing.T) which builds a manifestRenderConfig, reads files from ../../install and ../../bootstrap, renders each manifest via renderManifest, parses rendered YAML with manifest.ParseManifests, ensures each parsed object has at least one annotation key starting with include.release.openshift.io/, and reports any missing manifests (original path, GVK, name, namespace). Adds imports: bytes, fmt, path/filepath, and github.com/openshift/library-go/pkg/manifest.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically describes the main change: adding validation that all CVO manifests in the payload include a required annotation.
Stable And Deterministic Test Names ✅ Passed Test names are stable, descriptive static strings with no dynamic values. Standard Go testing conventions are used instead of Ginkgo patterns.
Test Structure And Quality ✅ Passed The added test is a standard Go test, not Ginkgo test code, so the custom check criteria for Ginkgo-specific patterns do not apply.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands and usage tips.

@hongkailiu hongkailiu changed the title All CVO manifests in payload should be included NO-JIRA: All CVO manifests in payload should be included Mar 5, 2026
@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label Mar 5, 2026
@openshift-ci-robot
Copy link
Copy Markdown
Contributor

@hongkailiu: This pull request explicitly references no jira issue.

Details

In response to this:

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci bot commented Mar 5, 2026

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: hongkailiu

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-ci openshift-ci bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Mar 5, 2026
Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
pkg/payload/render_test.go (1)

67-84: Scan manifests recursively to match the “all manifests” intent.

At Line 68, os.ReadDir only checks the top level of ../../install, so nested manifest files would be skipped silently.

♻️ Proposed refactor
-	installDir := filepath.Join("../../install")
-	files, err := os.ReadDir(installDir)
+	installDir := "../../install"
+	var files []string
+	err := filepath.Walk(installDir, func(path string, info os.FileInfo, err error) error {
+		if err != nil {
+			return err
+		}
+		if info.IsDir() {
+			return nil
+		}
+		ext := strings.ToLower(filepath.Ext(info.Name()))
+		if ext == ".yaml" || ext == ".yml" {
+			files = append(files, path)
+		}
+		return nil
+	})
 	if err != nil {
 		t.Fatalf("failed to read directory: %v", err)
 	}
@@
-	for _, manifestFile := range files {
-		if manifestFile.IsDir() {
-			continue
-		}
-		filePath := filepath.Join(installDir, manifestFile.Name())
+	for _, filePath := range files {
 		manifests, err := manifest.ManifestsFromFiles([]string{filePath})
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/payload/render_test.go` around lines 67 - 84, The test reads installDir
using os.ReadDir which only lists the top-level entries, so nested manifests
under installDir are missed; change the directory traversal to recurse (e.g.,
use filepath.WalkDir or a recursive os.ReadDir helper) to collect all file paths
under installDir before calling manifest.ManifestsFromFiles, then filter files
as before into manifestsWithoutIncludeAnnotation using the existing prefix
constant ("include.release.openshift.io/"), ensuring you pass the full list of
discovered file paths (not just top-level entries) to
manifest.ManifestsFromFiles.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@pkg/payload/render_test.go`:
- Line 108: The failure message in the t.Fatalf call (t.Fatalf("Those manifests
have no annotation with prefix %q and will not beinstalled by CVO: %s", prefix,
strings.Join(messages, "', '"))) has a typo ("beinstalled") and produces awkward
quoting via strings.Join(messages, "', '"); update the string to "will not be
installed by CVO" and change the join to a readable separator such as
strings.Join(messages, ", ") (or wrap each message in quotes before joining if
quoted output is desired) so the output reads cleanly; the change should be made
where t.Fatalf is invoked and references variables prefix and messages and the
strings.Join call.

---

Nitpick comments:
In `@pkg/payload/render_test.go`:
- Around line 67-84: The test reads installDir using os.ReadDir which only lists
the top-level entries, so nested manifests under installDir are missed; change
the directory traversal to recurse (e.g., use filepath.WalkDir or a recursive
os.ReadDir helper) to collect all file paths under installDir before calling
manifest.ManifestsFromFiles, then filter files as before into
manifestsWithoutIncludeAnnotation using the existing prefix constant
("include.release.openshift.io/"), ensuring you pass the full list of discovered
file paths (not just top-level entries) to manifest.ManifestsFromFiles.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository: openshift/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 7ee548f7-464a-4daa-97d6-5d95b1260f20

📥 Commits

Reviewing files that changed from the base of the PR and between 57706c4 and f6ab856.

📒 Files selected for processing (1)
  • pkg/payload/render_test.go

}

func Test_cvoManifests(t *testing.T) {
installDir := filepath.Join("../../install")
Copy link
Copy Markdown
Contributor

@DavidHurta DavidHurta Mar 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A small note while I am just passing by. Maybe this is also needed for the bootstrap folder. I would need to check the relevant logic, but it's worth checking.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

Please be aware of the new rendering step.

The reason is in the commit message of 4f5d0e3

@hongkailiu hongkailiu force-pushed the annotation-checking branch from 9d5717b to 8610704 Compare March 5, 2026 21:30
Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
pkg/payload/render_test.go (1)

88-103: Use recursive manifest discovery to guarantee full payload coverage.

os.ReadDir(tt.dir) only checks top-level files. If manifests are later placed in nested directories, this test can miss them while still passing. Consider filepath.WalkDir with manifest-extension filtering.

♻️ Proposed refactor
+import "io/fs"
...
-			files, err := os.ReadDir(tt.dir)
+			var files []string
+			err := filepath.WalkDir(tt.dir, func(path string, d fs.DirEntry, err error) error {
+				if err != nil {
+					return err
+				}
+				if d.IsDir() {
+					return nil
+				}
+				ext := strings.ToLower(filepath.Ext(path))
+				if ext != ".yaml" && ext != ".yml" && ext != ".json" {
+					return nil
+				}
+				files = append(files, path)
+				return nil
+			})
 			if err != nil {
 				t.Fatalf("failed to read directory: %v", err)
 			}

 			if len(files) == 0 {
 				t.Fatalf("no files found in %s", tt.dir)
 			}
...
-			for _, manifestFile := range files {
-				if manifestFile.IsDir() {
-					continue
-				}
-				filePath := filepath.Join(tt.dir, manifestFile.Name())
+			for _, filePath := range files {

Also applies to: 99-103

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/payload/render_test.go` around lines 88 - 103, The test currently uses
os.ReadDir(tt.dir) which only reads top-level entries, so replace that with a
recursive walk (use filepath.WalkDir starting at tt.dir) to discover manifests
in nested directories; inside the WalkDir callback skip directories, filter
files by manifest extensions (e.g., .yaml, .yml, .json), build the same list
previously populated (manifestsWithoutIncludeAnnotation) and preserve the
existing logic that computes include annotation checks using prefix
("include.release.openshift.io/"); apply the same change for the other
occurrence noted around lines 99-103 so both checks use recursive discovery and
proper error handling in the WalkDir callback.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@pkg/payload/render_test.go`:
- Around line 88-103: The test currently uses os.ReadDir(tt.dir) which only
reads top-level entries, so replace that with a recursive walk (use
filepath.WalkDir starting at tt.dir) to discover manifests in nested
directories; inside the WalkDir callback skip directories, filter files by
manifest extensions (e.g., .yaml, .yml, .json), build the same list previously
populated (manifestsWithoutIncludeAnnotation) and preserve the existing logic
that computes include annotation checks using prefix
("include.release.openshift.io/"); apply the same change for the other
occurrence noted around lines 99-103 so both checks use recursive discovery and
proper error handling in the WalkDir callback.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository: openshift/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 9c077e32-6dc9-4d0a-b033-8f4869543795

📥 Commits

Reviewing files that changed from the base of the PR and between f6ab856 and 9d5717b.

📒 Files selected for processing (1)
  • pkg/payload/render_test.go

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
pkg/payload/render_test.go (1)

88-103: Use recursive traversal so this test truly covers all payload manifests.

os.ReadDir only checks one directory level, and Line 100 skips subdirectories entirely. If manifests are later placed in nested folders, they won’t be validated.

♻️ Proposed refactor
 import (
 	"bytes"
 	"fmt"
+	"io/fs"
 	"os"
 	"path/filepath"
 	"strings"
 	"testing"
@@
-			files, err := os.ReadDir(tt.dir)
-			if err != nil {
-				t.Fatalf("failed to read directory: %v", err)
-			}
-
-			if len(files) == 0 {
-				t.Fatalf("no files found in %s", tt.dir)
-			}
-
 			var manifestsWithoutIncludeAnnotation []manifest.Manifest
 			const prefix = "include.release.openshift.io/"
-			for _, manifestFile := range files {
-				if manifestFile.IsDir() {
-					continue
-				}
-				filePath := filepath.Join(tt.dir, manifestFile.Name())
-				data, err := os.ReadFile(filePath)
-				if err != nil {
-					t.Fatalf("failed to read manifest file: %v", err)
-				}
-				data, err = renderManifest(config, data)
-				if err != nil {
-					t.Fatalf("failed to render manifest: %v", err)
-				}
-				manifests, err := manifest.ParseManifests(bytes.NewReader(data))
-				if err != nil {
-					t.Fatalf("failed to load manifests: %v", err)
-				}
-
-				for _, m := range manifests {
-					m.OriginalFilename = filePath
-					var found bool
-					for k := range m.Obj.GetAnnotations() {
-						if strings.HasPrefix(k, prefix) {
-							found = true
-							break
-						}
-					}
-					if !found {
-						manifestsWithoutIncludeAnnotation = append(manifestsWithoutIncludeAnnotation, m)
-					}
-				}
-			}
+			err := filepath.WalkDir(tt.dir, func(filePath string, d fs.DirEntry, walkErr error) error {
+				if walkErr != nil {
+					return walkErr
+				}
+				if d.IsDir() {
+					return nil
+				}
+				data, err := os.ReadFile(filePath)
+				if err != nil {
+					return fmt.Errorf("read manifest file %s: %w", filePath, err)
+				}
+				data, err = renderManifest(config, data)
+				if err != nil {
+					return fmt.Errorf("render manifest %s: %w", filePath, err)
+				}
+				manifests, err := manifest.ParseManifests(bytes.NewReader(data))
+				if err != nil {
+					return fmt.Errorf("load manifests from %s: %w", filePath, err)
+				}
+				for _, m := range manifests {
+					m.OriginalFilename = filePath
+					var found bool
+					for k := range m.Obj.GetAnnotations() {
+						if strings.HasPrefix(k, prefix) {
+							found = true
+							break
+						}
+					}
+					if !found {
+						manifestsWithoutIncludeAnnotation = append(manifestsWithoutIncludeAnnotation, m)
+					}
+				}
+				return nil
+			})
+			if err != nil {
+				t.Fatalf("failed manifest scan for %s: %v", tt.dir, err)
+			}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/payload/render_test.go` around lines 88 - 103, The test currently uses
os.ReadDir on tt.dir and skips subdirectories (manifestFile.IsDir()), so nested
manifests are ignored; replace the non-recursive loop with a recursive traversal
(e.g., filepath.WalkDir) starting at tt.dir, skip directory entries inside the
WalkDirFunc, and for each file build the full path (similar to filePath :=
filepath.Join(...)) and run the same manifest parsing/annotation checks that
populate manifestsWithoutIncludeAnnotation using the same const prefix =
"include.release.openshift.io/"; ensure symlinks or non-regular files are
handled consistently with the original behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@pkg/payload/render_test.go`:
- Around line 88-103: The test currently uses os.ReadDir on tt.dir and skips
subdirectories (manifestFile.IsDir()), so nested manifests are ignored; replace
the non-recursive loop with a recursive traversal (e.g., filepath.WalkDir)
starting at tt.dir, skip directory entries inside the WalkDirFunc, and for each
file build the full path (similar to filePath := filepath.Join(...)) and run the
same manifest parsing/annotation checks that populate
manifestsWithoutIncludeAnnotation using the same const prefix =
"include.release.openshift.io/"; ensure symlinks or non-regular files are
handled consistently with the original behavior.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository: openshift/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: cf01a442-d51b-4963-8b27-88be2f9c57ad

📥 Commits

Reviewing files that changed from the base of the PR and between 9d5717b and 8610704.

📒 Files selected for processing (1)
  • pkg/payload/render_test.go

@hongkailiu
Copy link
Copy Markdown
Member Author

/retest-required

1 similar comment
@hongkailiu
Copy link
Copy Markdown
Member Author

/retest-required

@hongkailiu
Copy link
Copy Markdown
Member Author

/test e2e-agnostic-ovn-techpreview-serial-2of3

@hongkailiu
Copy link
Copy Markdown
Member Author

/testwith openshift/cluster-version-operator/main/e2e-agnostic-ovn-techpreview-serial openshift/oc#2170

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci bot commented Mar 18, 2026

@hongkailiu, testwith: could not generate prow job. ERROR:

could not determine cluster for job pull-ci-openshift-cluster-version-operator-main-e2e-agnostic-ovn-techpreview-serial: error performing request: got unexpected http 404 status code from dispatcher: Cluster not found

@hongkailiu
Copy link
Copy Markdown
Member Author

/testwith openshift/cluster-version-operator/main/e2e-agnostic-ovn-techpreview-serial openshift/oc#2170

@openshift-ci openshift-ci bot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Mar 24, 2026
Because `bootstrap-pod.yaml` is not a valid yaml [1], we have to render it
and then parse out manifests from it.

We could make it valid as we did for the others, but it might be dangerous
to do so. We have only one manifest for bootstrap. I am fine with a
rendering step.

openshift#1171 (comment)
@hongkailiu hongkailiu force-pushed the annotation-checking branch from 8610704 to 8fefb19 Compare March 24, 2026 14:26
@openshift-ci openshift-ci bot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Mar 24, 2026
@hongkailiu
Copy link
Copy Markdown
Member Author

/testwith openshift/cluster-version-operator/main/e2e-agnostic-ovn-techpreview-serial openshift/oc#2170

@hongkailiu
Copy link
Copy Markdown
Member Author

/retest

@hongkailiu hongkailiu force-pushed the annotation-checking branch from 8fefb19 to c5a222b Compare March 30, 2026 14:29
Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@pkg/payload/render_test.go`:
- Around line 332-347: The test currently reads only top-level entries from
tt.dir using os.ReadDir and skips directories (manifestFile.IsDir()), so nested
manifests are missed; update the logic that builds
manifestsWithoutIncludeAnnotation to recursively walk tt.dir (e.g., using
filepath.WalkDir) and collect regular files (filtering for manifest file types
like .yaml/.yml/.json or using manifest.Parse) instead of skipping directories,
then open and validate each discovered file (use the same variable names:
tt.dir, manifestFile/filePath, manifestsWithoutIncludeAnnotation, and prefix) so
nested manifests are included in the validation.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 441c9f1b-b7e2-48fb-896c-799b8cc3a342

📥 Commits

Reviewing files that changed from the base of the PR and between 8fefb19 and c5a222b.

📒 Files selected for processing (1)
  • pkg/payload/render_test.go

Comment on lines +332 to +347
files, err := os.ReadDir(tt.dir)
if err != nil {
t.Fatalf("failed to read directory: %v", err)
}

if len(files) == 0 {
t.Fatalf("no files found in %s", tt.dir)
}

var manifestsWithoutIncludeAnnotation []manifest.Manifest
const prefix = "include.release.openshift.io/"
for _, manifestFile := range files {
if manifestFile.IsDir() {
continue
}
filePath := filepath.Join(tt.dir, manifestFile.Name())
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Top-level-only scan can miss manifests and under-report violations.

Line 332 reads only direct entries, and Line 344-Line 346 skips directories entirely. If manifests exist under nested folders, they are never validated, so this test can pass while missing unannotated payload manifests.

🔧 Suggested fix (recursive walk + manifest file filtering)
 import (
 	"bytes"
 	"fmt"
+	"io/fs"
 	"os"
 	"path/filepath"
 	"strings"
 	"testing"
@@
-			files, err := os.ReadDir(tt.dir)
+			var files []string
+			err := filepath.WalkDir(tt.dir, func(path string, d fs.DirEntry, err error) error {
+				if err != nil {
+					return err
+				}
+				if d.IsDir() {
+					return nil
+				}
+				ext := strings.ToLower(filepath.Ext(d.Name()))
+				if ext != ".yaml" && ext != ".yml" && ext != ".json" {
+					return nil
+				}
+				files = append(files, path)
+				return nil
+			})
 			if err != nil {
 				t.Fatalf("failed to read directory: %v", err)
 			}
@@
-			for _, manifestFile := range files {
-				if manifestFile.IsDir() {
-					continue
-				}
-				filePath := filepath.Join(tt.dir, manifestFile.Name())
+			for _, filePath := range files {
 				data, err := os.ReadFile(filePath)
 				if err != nil {
 					t.Fatalf("failed to read manifest file: %v", err)
 				}

As per coding guidelines, "**: -Focus on major issues impacting performance, readability, maintainability and security. Avoid nitpicks and avoid verbosity."

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
files, err := os.ReadDir(tt.dir)
if err != nil {
t.Fatalf("failed to read directory: %v", err)
}
if len(files) == 0 {
t.Fatalf("no files found in %s", tt.dir)
}
var manifestsWithoutIncludeAnnotation []manifest.Manifest
const prefix = "include.release.openshift.io/"
for _, manifestFile := range files {
if manifestFile.IsDir() {
continue
}
filePath := filepath.Join(tt.dir, manifestFile.Name())
var files []string
err := filepath.WalkDir(tt.dir, func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
if d.IsDir() {
return nil
}
ext := strings.ToLower(filepath.Ext(d.Name()))
if ext != ".yaml" && ext != ".yml" && ext != ".json" {
return nil
}
files = append(files, path)
return nil
})
if err != nil {
t.Fatalf("failed to read directory: %v", err)
}
if len(files) == 0 {
t.Fatalf("no files found in %s", tt.dir)
}
var manifestsWithoutIncludeAnnotation []manifest.Manifest
const prefix = "include.release.openshift.io/"
for _, filePath := range files {
data, err := os.ReadFile(filePath)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/payload/render_test.go` around lines 332 - 347, The test currently reads
only top-level entries from tt.dir using os.ReadDir and skips directories
(manifestFile.IsDir()), so nested manifests are missed; update the logic that
builds manifestsWithoutIncludeAnnotation to recursively walk tt.dir (e.g., using
filepath.WalkDir) and collect regular files (filtering for manifest file types
like .yaml/.yml/.json or using manifest.Parse) instead of skipping directories,
then open and validate each discovered file (use the same variable names:
tt.dir, manifestFile/filePath, manifestsWithoutIncludeAnnotation, and prefix) so
nested manifests are included in the validation.

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci bot commented Mar 30, 2026

@hongkailiu: The following tests failed, say /retest to rerun all failed tests or /retest-required to rerun all mandatory failed tests:

Test name Commit Details Required Rerun command
ci/prow/e2e-agnostic-ovn-techpreview-serial 8610704 link true /test e2e-agnostic-ovn-techpreview-serial
ci/prow/e2e-agnostic-ovn-techpreview-serial-2of3 c5a222b link true /test e2e-agnostic-ovn-techpreview-serial-2of3
ci/prow/e2e-agnostic-ovn-techpreview-serial-1of3 c5a222b link true /test e2e-agnostic-ovn-techpreview-serial-1of3
ci/prow/e2e-hypershift-conformance c5a222b link true /test e2e-hypershift-conformance
ci/prow/e2e-agnostic-ovn-upgrade-into-change c5a222b link true /test e2e-agnostic-ovn-upgrade-into-change
ci/prow/e2e-agnostic-ovn-upgrade-out-of-change c5a222b link true /test e2e-agnostic-ovn-upgrade-out-of-change
ci/prow/e2e-agnostic-ovn-techpreview-serial-3of3 c5a222b link true /test e2e-agnostic-ovn-techpreview-serial-3of3

Full PR test history. Your PR dashboard.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. jira/valid-reference Indicates that this PR references a valid Jira ticket of any type.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants